from django.shortcuts import render
from django.views import View
from django.http import HttpResponse, JsonResponse
from django_redis import get_redis_connection
from meiduo_mall.settings.dev import logger
import random
from apps.verifications import constants


# 图形验证码类视图
class ImageCodeView(View):
    """图形验证码"""

    def get(self, request, uuid):
        """
        :param request: 请求对象
        :param uuid: 唯一标识图形验证码所属于的用户
        :return: image/jpg
        """
        # 生成图片验证码
        from libs.captcha.captcha import captcha
        text, image = captcha.generate_captcha()

        # 保存图片验证码
        from django_redis import get_redis_connection
        image_redis_client = get_redis_connection('verify_image_code')
        image_redis_client.setex('img_%s' % uuid, 300, text)

        # 响应图片验证码
        return HttpResponse(image, content_type='image/jpeg')

# 短信验证码
class SMSCodeView(View):
    """短信验证码"""
    def get(self, request, mobile):
        """
        :param reqeust: 请求对象
        :param mobile: 手机号
        :return: JSON
        """
        # 1.解析校验参数--mobile 不用校验
        uuid = request.GET.get('image_code_id')
        image_code = request.GET.get('image_code')

        # 2.避免频繁发送短信
        sms_redis_client = get_redis_connection('sms_code')
        # 2.1 取出 redis 保存发短信的标识
        send_flag = sms_redis_client.get('send_flag_%s' % mobile)
        # 2.2 判读有还是没有
        #   2.2.1 有, 返回太频繁
        if send_flag:
            return JsonResponse({'code': '4002', 'errmsg': '发送短信太频繁了'})
        #   2.1.2 没有 ,向下执行--->发送短信, 给redis设置标识

        # 3.生成短信验证码 6位 随机码 random.radint(0,999999)
        sms_code = '%06d' % random.randint(0, 999999)
        # 4.redis存储 短信验证码
        # 使用常量代替数字
        try:
            p1 = sms_redis_client.pipeline()
            #                                       60
            p1.setex('send_flag_%s' % mobile, constants.SMSCODE_SEND_TIME, 1)
            #                                           300
            p1.setex('sms_%s' % mobile, constants.SMSCODE_EXPIRE_TIME, sms_code)
            p1.execute()
        except Exception as e:
            logger.error(e)

        # 5.容联云发送短信---celery异步发送
        from celery_tasks.sms.tasks import send_sms_code
        send_sms_code.delay(mobile, sms_code)




        # # 2.校验图形验证码 如果正确 发送验证码, 不正确 直接返回
        # # 2.1 根据uuid 去redis数据库查询 图片验证码
        #
        # try:
        #     image_redis_client = get_redis_connection('verify_image_code')
        #     redis_img_code = image_redis_client.get('img_%s' % uuid)
        #     # 判断服务器返回的验证
        #     if not redis_img_code:
        #         return JsonResponse({'code': "4001", 'errmsg': '图形验证码失效了'})
        #     # 2.2 和前端传过来的进行做对比
        #     # 千万注意: 在redis取出来的是 bytes 类型不能直接做对比 decode()
        #     if redis_img_code.decode().lower() != image_code.lower():
        #         return JsonResponse({'code': "4001", 'errmsg': '图形验证码错误!'})
        #     # 如果有值 删除redis服务器上的图形验证码
        #     image_redis_client.delete('img_%s' % uuid)
        # except Exception as e:
        #     logger.error(e)
        #
        # # 3.生成短信验证码,redis-存储
        # sms_code = "%06d" % randint(0, 999999)
        # try:
        #     sms_redis_client = get_redis_connection('sms_code')
        #     sms_redis_client.setex("sms_%s" % mobile, 300, sms_code)
        # except Exception as e:
        #     logger.error(e)


        # 4.让第三方 容联云-给手机号-发送短信
        from libs.yuntongxun.sms import CCP
        #                        手机号           验证码  过期时间5分钟 ,类型默认1
        # CCP().send_template_sms(mobile, [sms_code, 5], 1)
        # CCP().send_template_sms(mobile, [sms_code, 5], 1)
        print("当前验证码是:", sms_code)

        # 5.告诉前端短信发送完毕
        return JsonResponse({'code': '0', 'errmsg': '发送短信成功'})